package com.Shuang.Demo5;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;
/*
* **需求**
在实际开发中，很多系统都要完成用户登录和注册功能，但需要注意的是，用户注册的登录名和密码必须是发送给服务端进行保存的，
* **并且注册的登录名是不能重复的**，同时登录也是需要到服务端进行认证的。
**功能点具体要求**
1、开发一个客户端，具备注册，和登录功能，除非用户输入exit，否则不退出这个界面。
2、注册功能要求：可以发送登录名和密码给服务端，服务端要响应是否注册成功的结果给客户端。如果注册没有问题，
* 服务端需要将用户注册的登录名和密码保存到文件中去。（**注：是什么文件，可自行确定**）
3、登录功能要求：用户输入登录名和密码，需要发送给服务端，服务端认证后需要把登录的结果发送给客户端接收。
* */

public class Client {

    private Socket socket;
    private Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        try {
            //1 创建客户端对象
            Client client = new Client();
            //2 启动客户端
            client.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //启动客户端
    private void start() throws Exception {
        //1 创建连接通道
        socket = new Socket("127.0.0.1", 1003);
        System.out.println("连接服务端成功~");

        //2 开发界面
        while (true) {
            // 提示功能
            System.out.println("==1、用户注册==");
            System.out.println("==2、用户登录==");
            System.out.println("请您输入指令：");
            String command = sc.next();
            switch (command){
                case "1":
                    //注册
                    register();
                    break;
                case "2":
                    //登录
                    logIn();
                    break;
                case "exit":
                    //退出系统
                    System.out.println("退出系统~");
                    socket.close(); //系统退出将管道关闭
                    return;
                default:
                    System.out.println("您输入的指令有误~请重新输入");
            }
        }
    }

    //注册
    private void register() throws Exception {
        System.out.println("=========用户注册==========");
        System.out.println("请您输入注册信息");
        System.out.println("请您输入登录名：");
        String loginName = sc.next();
        while (true) {
            System.out.println("请输入密码：");
            String passWord = sc.next();
            System.out.println("请确认密码：");
            String okPassWord = sc.next();
            if (okPassWord.equals(passWord)){
                // 发送登录名和密码给服务端保存
                DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
                dos.writeInt(1);  //相当于给服务端一个协议 1 代表服务端接收的是注册方法的登录名和密码
                dos.writeUTF(loginName);
                dos.writeUTF(passWord);
                dos.flush();
                break;
            }else {
                System.out.println("两次密码不一致，请重新输入密码");
            }
        }
        //注册完给到服务端之后立刻等待接收服务端的响应
        DataInputStream dis = new DataInputStream(socket.getInputStream());
        //将接收到的响应直接输出
        System.out.println(dis.readUTF());
    }

    //用户登录功能
    private void logIn() throws Exception {
        System.out.println("=========用户登录==========");
        System.out.println("请您输入登录信息");
        System.out.println("请您输入登录名：");
        String loginName = sc.next();

        System.out.println("请输入密码：");
        String passWord = sc.next();

        // 发送登录名和密码给服务端判断是否存在 正确
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        dos.writeInt(2);  //给服务端一个协议 2 代表服务端接收的是登录方法的用户名和密码
        dos.writeUTF(loginName);
        dos.writeUTF(passWord);
        dos.flush();

        //登录完给到服务端之后立刻等待接收服务端的响应
        DataInputStream dis = new DataInputStream(socket.getInputStream());
        //将接收到的响应直接输出
        System.out.println(dis.readUTF());
    }
}
